import { getToken, setToken, removeToken } from '@/utils/cookie';
import { loginApi, fetchUserInfoAPI } from '@/api/user/userApi';
import { resetRouter } from '@/router';

const actions = {
  /* 用于登录的action函数
   * 接受两个参数：context(上下文)、loginForm(组件dispatch过来的数据)
   */
  async loginAction(context, loginForm) {
    // 调用loginApi发送请求传入组件收集的表单数据，loginApi请求函数返回的是一个Promise
    const { data } = await loginApi(loginForm);
    // 调用commit联系setToken的mutations，并且传递请求回来的数据
    context.commit('setToken', data.token);
  },
  /*用于退出登录的action*/
  logoutAction(context, value) {
    // 调用commit联系clearToken的mutations，清空token
    context.commit('clearToken', value);
    context.commit('updateUserInfo', {});
  },
  /* 发送请求获取用户信息的action */
  async fetchUserInfo(context) {
    const { data } = await fetchUserInfoAPI();
    context.commit('updateUserInfo', data);
    return { menus: data.menus, permissions: data.permissions };
  },
};

const mutations = {
  /*设置token的mutation函数*/
  setToken(state, token) {
    // 存储vuex
    state.token = token;
    // 持久化存储
    setToken(token);
  },
  /*清空token的mutation函数*/
  clearToken(state, token) {
    // 清空vuex中的token
    state.token = token;
    // 清空cookie中的token
    removeToken();
    resetRouter();
  },
  /* 更新用户信息的mutation */
  updateUserInfo(state, userInfo) {
    state.userInfo = userInfo;
  },
};

const state = () => {
  return {
    token: getToken() || '',
    userInfo: {},
  };
};

export default {
  namespaced: true,
  state,
  mutations,
  actions,
};

